﻿using System;
using UnityEngine;

// 这有在这个文件夹里面这个类才有用
/*

这段代码是C#中的命名空间（namespace），用于组织和管理代码。在Unity中，命名空间用于避免命名冲突，并将相关的代码组织在一起。
在这个例子中，命名空间为 MGP_004CompoundBigWatermelon，它将所有的相关代码放置在一个单独的作用域中。这个命名空间中可能包含多个类、结构、接口或其他代码元素。命名空间的名字通常反映了它所包含的代码的目的或主题。
在Unity中，这个命名空间的作用是将与游戏项目 "MGP_004CompoundBigWatermelon" 相关的所有代码组织到一起，以便更好地管理和维护项目代码。在此命名空间中定义的类和其他代码元素可以在整个项目中被访问和使用。
*/
namespace MGP_004CompoundBigWatermelon
{ 

// 19、在工程中添加 Fruit 脚本，主要功能是，进行水果类型的标记，以及水果碰撞的监测


	public class Fruit : MonoBehaviour
	{
        private Rigidbody2D m_Rigidbody2D;
        private CircleCollider2D m_CircleCollider2D;
        private FruitSeriesType m_FruitSeriesType;
        private Action<Collision2D, Fruit> m_OnCompoundAction;

        public FruitSeriesType FruitType => m_FruitSeriesType;

// 碰撞体2D
        public Rigidbody2D Rigidbody2D
        {
            get
            {
                if (m_Rigidbody2D == null)
                {
                    m_Rigidbody2D = GetComponent<Rigidbody2D>();
                }

                return m_Rigidbody2D;
            }
        }

// 
        public CircleCollider2D CircleCollider2D
        {
            get
            {
                if (m_CircleCollider2D == null)
                {
                    m_CircleCollider2D = GetComponent<CircleCollider2D>();
                }

                return m_CircleCollider2D;
            }
        }


// Init() 定义水果类型，和统一水果碰撞合成的事件
        public void Init(FruitSeriesType fruitSeriesType, Action<Collision2D, Fruit> onCompoundAction)
        {
            DisableFruit();
            m_FruitSeriesType = fruitSeriesType;
            m_OnCompoundAction = onCompoundAction;
        }

// nableFruit()/DisableFruit() 是设置该水果是否有重力和碰撞效果，
        public void EnableFruit()
        {
            Rigidbody2D.bodyType = RigidbodyType2D.Dynamic;
            CircleCollider2D.enabled = true;
        }

/// <summary>
/// 禁用碰撞
/// </summary>
        public void DisableFruit()
        {
            Rigidbody2D.bodyType = RigidbodyType2D.Static;
            CircleCollider2D.enabled = false;
        }

        public void Fall()
        {
            EnableFruit();

        }

/// <summary>
/// 拿水果半径
/// </summary>
/// <returns></returns>
        public float GetRadius()
        {
            return CircleCollider2D.radius;
        }

        #region Unity Function

        /// <summary>
        /// 碰撞检测函数
        /// </summary>
        /// <param name="collision"></param>
        /// OnCollisionEnter2D() 该水果的碰撞检测，相同水果且不是大西瓜，则触发水果合成委托
        private void OnCollisionEnter2D(Collision2D collision)
        {
            // 不是大西瓜，则合成
            if (this.FruitType != FruitSeriesType.BigWatermelon)
            {
                // 判断与之相碰的也是水果
                Fruit otherRuit = collision.gameObject.GetComponent<Fruit>();
                if (otherRuit != null)
                {
                    // 水果类型相同，才触发合成新瓜
                    if (otherRuit.FruitType == this.FruitType)
                    {
                        if (m_OnCompoundAction != null)
                        {
                            m_OnCompoundAction.Invoke(collision, this);
                        }

                    }
                }
            }
        }

        #endregion

    }
}

